<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------

// 应用公共文件
use PHPMailer\PHPMailer\PHPMailer;      //邮件发送
use app\common\validate\BestSignValidate;

if (!function_exists('dd')) {
    function dd(...$param)
    {
        echo "<pre>";
        print_r($param[0]);exit;
    }
}

/**
 * 数组转xml
 */
if (!function_exists('ArrToXml')) {
    function ArrToXml($arr)
    {
        if (!is_array($arr) || count($arr) == 0) return '';

        $xml = "<xml>";
        foreach ($arr as $key => $val) {
            if (is_numeric($val)) {
                $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
            } else {
                $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
            }
        }
        $xml .= "</xml>";
        return $xml;
    }
}
/**
 * 随机生成数字+字母
 */
if (!function_exists('randomkeys')) {
    function randomkeys($length)
    {
        $pattern = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ';
        $key = '';
        for($i=0;$i<$length;$i++)
        {
            $key .= $pattern{mt_rand(0,35)};    //生成php随机数
        }
        return $key;
    }
}

/**
 * 返回数据到客户端
 * @access protected
 * @param mixed $data 要返回的数据
 * @param String $type AJAX返回数据格式
 * @param int $json_option 传递给json_encode的option参数
 * @return void
 */
if (!function_exists('ajaxReturn')) {
    function ajaxReturn($code,$data='',$type = '',$json_option = 0)
    {
        if (empty($type)) $type = config('app.default_ajax_return');
        switch (strtoupper($type)) {
            case 'JSON' :
                // 返回JSON数据格式到客户端 包含状态信息
                header('Content-Type:application/json; charset=utf-8');
                $params['code'] = $code;
                if($code!=1){
                    $params['msg'] = config("Code.$code");
                    if($data){
                        $params['data'] = $data;
                    }else{
                        $params['data'] = [];
                    }
                }else{
                    $params['msg']  = $data;
                    $params['data'] = [];

                }
                exit(json_encode($params,JSON_UNESCAPED_UNICODE));
            //return $params;
            case 'XML'  :
                // 返回xml格式数据
                header('Content-Type:text/xml; charset=utf-8');
                exit(xml_encode($data));
            case 'JSONP':
                // 返回JSON数据格式到客户端 包含状态信息
                header('Content-Type:application/json; charset=utf-8');
                $handler = isset($_GET[C('VAR_JSONP_HANDLER')]) ? $_GET[C('VAR_JSONP_HANDLER')] : C('DEFAULT_JSONP_HANDLER');
                exit($handler . '(' . json_encode($data, $json_option) . ');');
            case 'EVAL' :
                // 返回可执行的js脚本
                header('Content-Type:text/html; charset=utf-8');
                exit($data);
            default     :
                // 用于扩展其他返回格式数据
                Hook::listen('ajax_return', $data);
        }
    }
}

if (!function_exists('error')) {
    function error($code){
        return ['code'=>$code,'message'=>config("Code.$code")];
    }
}

if (!function_exists('success')) {
    function success($code,$data){
        return ['code'=>$code,'message'=>config("Code.$code"),'data'=>$data];
    }
}

/**
 * @param $URL url
 * @param $Param 传递参数
 * @param $header header头
 * @return bool|string
 */
if (!function_exists('post_data')) {
    function post_data($URL, $Param='', $header='')
    {
        // 初始化
        $curl = curl_init();

        $headers = array(
            "token:".$header,
            //"Content-Type: application/json"
        );

        // 设置抓取的url
        curl_setopt($curl, CURLOPT_URL, $URL);

        // 设置头文件的信息作为数据流输出
        // curl_setopt ( $curl, CURLOPT_HEADER, 1 ); // 注释掉 显示 HTTP 头部信息 开启后有助于调试信息

        // 设置获取的信息以文件流的形式返回，而不是直接输出。
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

        // 设置post方式提交
        curl_setopt($curl, CURLOPT_POST, 1);

        //curl_setopt($curl, CURLOPT_HTTPHEADER,array("Content-Type: application/json"));
        curl_setopt($curl, CURLOPT_HTTPHEADER,$headers);


        curl_setopt($curl, CURLOPT_POSTFIELDS, $Param);

        // 发起 https 请求
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);

        // 执行命令
        $Data = curl_exec($curl);
        //$err = curl_error($curl);

        // 关闭URL请求
        curl_close($curl);
        // 返回(显示)获得的数据
        return $Data;
    }
}

/**
 * 模拟get
 */
if (!function_exists('get_data')) {
    function get_data($URL,$data='')
    {
        // 初始化
        $curl = curl_init();

        $headers = array(
            'token:'.$data,
        );

        // 设置抓取的url
        curl_setopt($curl, CURLOPT_URL, $URL);

        // 设置头文件的信息作为数据流输出
        // curl_setopt ( $curl, CURLOPT_HEADER, 1 ); // 注释掉 显示 HTTP 头部信息 开启后有助于调试信息

        // 设置获取的信息以文件流的形式返回，而不是直接输出。
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); //这个是重点。

        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

        // 执行命令
        $Data = curl_exec($curl);

        //$err = curl_error($curl);

        // 关闭URL请求
        curl_close($curl);

        // 返回(显示)获得的数据
        return $Data;
    }
}
if (!function_exists('upload')) {
    function upload($dir,$file)
    {
        $file = request()->file('image');
        // 移动到框架应用根目录/public/uploads/ 目录下
        if ($file) {
            $info = $file->move($dir);
            if ($info) {
                echo $info->getSaveName();
            } else {
                // 上传失败获取错误信息
                echo $file->getError();
            }
        }
    }
}



/**
 * @param $address  收件人地址
 * @param $title    邮件标题
 * @param $message  邮件内容
 * @return bool
 * @throws \PHPMailer\PHPMailer\Exception
 */
if (!function_exists('sendMail')) {
    function sendMail($address, $title='', $message='', $object='')
    {
        $mail = new PHPMailer();
        // 设置PHPMailer使用SMTP服务器发送Email
        $mail->IsSMTP();
        // 设置邮件的字符编码，若不指定，则为'UTF-8'
        $mail->CharSet = 'UTF-8';
        // 添加收件人地址，可以多次使用来添加多个收件人
        $mail->AddAddress($address);
        // 设置邮件正文

        if ($message) {
            $mail->Body = $message;
        } else {
            $mail->Body = '桃苑公寓';
        }

        //设置发件人邮箱地址 这里填入上述提到的“发件人邮箱”
        $mail->From = '494046980@qq.com';

        //设置发件人姓名（昵称） 任意内容，显示在收件人邮件的发件人邮箱地址前的发件人姓名
        $mail->FromName = '桃苑';

        // 设置邮件标题
        if ($title) {
            $mail->Subject = $title;
        } else {
            $mail->Subject = '桃苑公寓';
        }

        // 添加附件,并指定名称
        if ($object) {
            $mail->AddAttachment($object);
        }

        $mail->SMTPSecure = 'ssl';#设置使用ssl加密方式登录鉴权
        $mail->Port = 465;#设置ssl连接smtp服务器的远程服务器端口号

        // 设置SMTP服务器。
        $mail->Host = 'smtp.qq.com';
        // 设置为"需要验证"
        $mail->SMTPAuth = true;
        //smtp登录的账号 这里填入字符串格式的qq号即可
        $mail->Username = '494046980';
        //smtp登录的密码 使用生成的授权码 你的最新的授权码
        $mail->Password = 'cojksxcjjiwpbibc';
        // 发送邮件。    成功返回true或false
        //return $mail->Send();

        return $mail->Send();

        /*        if(!$mail->Send()) {
                    echo "Mailer Error: " . $mail->ErrorInfo;exit;
                } else {
                    echo "Message sent!";
                }*/

    }
}



if (!function_exists('deep_in_array')) {
    function deep_in_array($value, $array)
    {
        foreach ($array as $item) {
            if (!is_array($item)) {
                if ($item == $value) {
                    return true;
                } else {
                    continue;
                }
            }
            if (in_array($value, $item)) {
                return true;
            } else if (deep_in_array($value, $item)) {
                return true;
            }
        }
        return false;
    }
}

/**
 * 自定义日志写入
 */
if (!function_exists('myLog')) {
    function myLog($filename, $data=''){
        $path = "./logs";
        $filepath = "./logs/$filename".".log";

        if(!is_dir("./logs")){
            mkdir($path,0777,TRUE);
        }
        $myfile  = fopen($filepath,"a");
        fwrite($myfile, $data.PHP_EOL);
        fclose($myfile);
    }
}



/**
 * 数字转为金额的大写汉字
 */
if (!function_exists('moneyToString2')) {
    function moneyToString2($num)
    {
        $digits = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
        $radices = ['', '拾', '佰', '仟', '万', '亿'];
        $bigRadices = ['', '万', '亿'];
        $decimals = ['角', '分'];
        $cn_dollar = '元';
        $cn_integer = '整';
        $num_arr = explode('.', $num);
        $int_str = $num_arr[0] ?? '';
        $float_str = $num_arr[1] ?? '';
        $outputCharacters = '';
        if ($int_str) {
            $int_len = strlen($int_str);
            $zeroCount = 0;
            for ($i = 0; $i < $int_len; $i++) {
                $p = $int_len - $i - 1;
                $d = substr($int_str, $i, 1);
                $quotient = $p / 4;
                $modulus = $p % 4;
                if ($d == "0") {
                    $zeroCount++;
                } else {
                    if ($zeroCount > 0) {
                        $outputCharacters += $digits[0];
                    }
                    $zeroCount = 0;
                    $outputCharacters .= $digits[$d] . $radices[$modulus];
                }
                if ($modulus == 0 && $zeroCount < 4) {
                    $outputCharacters .= $bigRadices[$quotient];
                    $zeroCount = 0;
                }
            }
            $outputCharacters .= $cn_dollar;
        }
        if ($float_str) {
            $float_len = strlen($float_str);
            for ($i = 0; $i < $float_len; $i++) {
                $d = substr($float_str, $i, 1);
                if ($d != "0") {
                    $outputCharacters .= $digits[$d] . $decimals[$i];
                }
            }
        }
        if ($outputCharacters == "") {
            $outputCharacters = $digits[0] . $cn_dollar;
        }
        if ($float_str) {
            $outputCharacters .= $cn_integer;
        }
        return $outputCharacters;
    }
}


/**
 * 数字转为金额的大写汉字
 */
if (!function_exists('moneyToString')) {
    function moneyToString($amount, $type = 1)
    {
        // 判断输出的金额是否为数字或数字字符串
        if (!is_numeric($amount)) {
            return "要转换的金额只能为数字!";
        }

        // 金额为0,则直接输出"零元整"
        if ($amount == 0) {
            return "零元整";
        }

        // 金额不能为负数
        if ($amount < 0) {
            return "要转换的金额不能为负数!";
        }

        // 金额不能超过万亿,即12位
        if (strlen($amount) > 12) {
            return "要转换的金额不能为万亿及更高金额!";
        }

        // 预定义中文转换的数组
        $digital = array('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖');
        // 预定义单位转换的数组
        $position = array('仟', '佰', '拾', '亿', '仟', '佰', '拾', '万', '仟', '佰', '拾', '元');

        // 将金额的数值字符串拆分成数组
        $amountArr = explode('.', $amount);

        // 将整数位的数值字符串拆分成数组
        $integerArr = str_split($amountArr[0], 1);

        // 将整数部分替换成大写汉字
        $result = '';
        $integerArrLength = count($integerArr);     // 整数位数组的长度
        $positionLength = count($position);         // 单位数组的长度
        for ($i = 0; $i < $integerArrLength; $i++) {
            // 如果数值不为0,则正常转换
            if ($integerArr[$i] != 0) {
                $result = $result . $digital[$integerArr[$i]] . $position[$positionLength - $integerArrLength + $i];
            } else {
                // 如果数值为0, 且单位是亿,万,元这三个的时候,则直接显示单位
                if (($positionLength - $integerArrLength + $i + 1) % 4 == 0) {
                    $result = $result . $position[$positionLength - $integerArrLength + $i];
                }
            }
        }

        // 如果小数位也要转换
        if ($type == 0) {
            // 将小数位的数值字符串拆分成数组
            $decimalArr = str_split($amountArr[1], 1);
            // 将角替换成大写汉字. 如果为0,则不替换
            if ($decimalArr[0] != 0) {
                $result = $result . $digital[$decimalArr[0]] . '角';
            }
            // 将分替换成大写汉字. 如果为0,则不替换
            if ($decimalArr[1] != 0) {
                $result = $result . $digital[$decimalArr[1]] . '分';
            }
        } else {
            $result = $result . '整';
        }
        return $result;
    }

}
if (!function_exists('curl')) {
    function curl($config){
        //,$url,$data=false,$time=10,$header=false,$user_agent=false
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $config['url']);//设置抓取的url
        !empty($config['ua'])&&curl_setopt($ch, CURLOPT_USERAGENT,$config['ua']);
        !empty($config['data'])&&curl_setopt($ch, CURLOPT_POST, true);//设置post方式提交
        !empty($config['data'])&&curl_setopt($ch, CURLOPT_POSTFIELDS, $config['data']);//设置post数据
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        !empty($config['header'])&&curl_setopt($ch,CURLOPT_HTTPHEADER,$config['header']);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//设置获取的信息以字符流的形式返回，而不是直接输出
        curl_setopt($ch,CURLOPT_HEADER,false);//是否输出页面内容
        !empty($config['time'])&&curl_setopt($ch, CURLOPT_TIMEOUT, $config['time']);//抓取页面的等待时间为30秒
        //curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
        $response = curl_exec($ch);//执行命令
        if ($response === FALSE){
            echo 'cURL Error:'.curl_error($ch);
        }
        curl_close($ch);//关闭URL请求
        //返回数据
        return $response;
    }
}
if (!function_exists('tip')) {
    function tip($code=400000,$msg='参数错误',$data=false){
        exit(json_encode(array('code'=>$code,'msg'=>$msg,'data'=>$data),JSON_UNESCAPED_UNICODE));
    }
}

if (!function_exists('MakeSign')) {
    function MakeSign($input,$key){
        //签名步骤一：按字典序排序参数
        ksort($input);
        $buff = '';
        foreach ($input as $k => $v)
        {
            if($k != "sign" && $v != "" && !is_array($v)){
                $buff .= $k . "=" . $v . "&";
            }
        }
        $buff = trim($buff, "&");
        //签名步骤二：在string后加入KEY
        $string = $buff . "&key=".$key;
        //签名步骤三：MD5加密或者HMAC-SHA256
        $string = hash_hmac("sha256",$string ,$key);
        //签名步骤四：所有字符转为大写
        $result = strtoupper($string);
        return $result;
    }
}


//写日志
if (!function_exists('writeLog')) {
    function writeLog($filename='Create',$content){
        $path = DOCUMENT_ROOT.'/Log/'.$filename;
        if (!is_dir($path)){
            mkdir($path,0777,true);
        }
        $file = $path.'/'.$filename.'_'.date('Y_m_d').'.txt';
        is_array($content)&&$content=json_encode($content,JSON_UNESCAPED_UNICODE);
        file_put_contents($file,$content.PHP_EOL,FILE_APPEND);  // 最简单的快速的以追加的方式写入写入方法，
    }
}

